// axios 配置
import axios from "axios";
import router from "@/router";
import store from "@/store"

// 全局默认配置
axios.defaults.baseURL = 'http://localhost:3000/admin/';  // 本地
// axios.defaults.baseURL = 'http://121.43.116.41:5566/admin';  //线上

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';


// 拦截器
// 请求拦截  =>  在请求发送之前进行拦截, 常用于修改数据,配置请求头(携带token)
// 响应拦截  =>  在服务端返回响应,响应被 then 或 catch 接收前拦截它们


// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // config.headers.a = 1;
    // config.headers.b = 2;
    // console.log("请求拦截", config); // 请求相关的配置
    // 在发送请求之前做些什么  => 携带token?  


    var authority = localStorage.getItem("authority");
    var token = null;
    if(authority){
        authority = JSON.parse(authority);
        token = authority.token;
        config.headers.token = token;
    }
    
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // console.log("响应拦截", response);
    // 对响应数据做点什么
    // return response;   // 默认返回 响应配置 => {status,data,config,headers}

    // response.status == 200  只表示后端返回了响应结果
    // 响应结果(前端发生请求 -> 数据的增删改查(操作) -> 返回响应结果( 响应的结果中也包含很多情况  => code = 200:成功  10003: 密码错误  10005:用户名未注册  100019: token已经过期 ))

    //  response.data => 返回服务器的响应数据
    // {code: '200', message: '登录成功', data: {…}}
    // {code: '10003', message: '密码错误'}
    // {code: '10005', message: '未注册'}
    // {code: '10119', message: 'token过期'}

    // 优化前  => 直接返回响应结果
    // return response.data;   // 返回服务器的响应数据 => 直接返回响应结果


    // 目的: 请求成功,操作成功 -> 走then
    //       只要有一个失败  -> 走catch  -> 将所有的错误整合到一起-> 统一处理

    // 对响应结果进行  二次校验
    let {code,message} =  response.data;  // 对响应结果再次进行判断
    console.log(1111,code);
    if(code == 200){ //  操作成功
        return response.data;
    }else if(code == 10119){ // token已经过期-> 重新登录(去登录页)  => 后续处理

        // console.log("token已经过期",router);
        // console.log("当前路由信息",router.currentRoute);

        // 去登录 -> 先清除vuex中的信息/localstorage
        store.dispatch("exitAndAndUpdateUserInfo");

        // 去登录  
        router.push({name:"login",query:{ReturnUrl:router.currentRoute.fullPath}});
        
        var tokenError = new Error("token已过期");
        return Promise.reject(tokenError);
    }else{
        var err = new Error(message);
        return Promise.reject(err);
    }
    


}, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    console.log(111111,error);
    return Promise.reject(error);
});


export default axios;


